'''
offer再见
负数用补码，2**32+n来统计
'''
# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        return bin(n).count("1") if n>=0 else bin(2**32+n).count("1")
'''
查找0的个数
'''
# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        return bin(n).replace("0b","").count("0") if n>=0 else bin(2**32+n).replace("0b","").count("0")
'''
递归：
负数也是用二进制表示的，只不过使用补码，最高位的符号位是1，用补码减1时，运算规则和正数用原码是一样的。
public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while(n!= 0){
            count++;
            n = n & (n - 1);
         }
        return count;
    }
}
'''
'''
剑指offer
补码=原码取反+1，符号位为1
因为python中没有int,long，python 原本数据很长远远大于32位，
为了把数字处理在32位内，所以和0xffffffff(二进制为32位1)与运算前面部分就不要了，包括符号位,所以就达到去负号的作用.
'''
# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        if n<0:
            n = n & 0xffffffff
        result = 0
        while n:
            result += 1
            n = n&(n-1)
        return result